# -*- coding: utf-8 -*-
"""
    xfree.user.plugins
    ~~~~~~~~~~~~~~~~~~~~~
    文件描述：这是xfree用户模块的插件实现。
    作者：xfree
    邮箱：cy_83k@qq.com

"""

# 导入chain函数，用于将多个可迭代对象连接成一个单一的可迭代对象
from itertools import chain
# 从flask_babelplus导入gettext并命名为_，用于处理多语言文本
from flask_babelplus import gettext as _
# 导入HookimplMarker用于标记插件实现函数
from pluggy import HookimplMarker

# 从相对路径下的模块导入NavigationLink类，可能用于生成导航链接
from..display.navigation import NavigationLink
# 从当前目录下的models模块导入User类，可能是用户模型类
from .models import User
# 从当前目录下的services.validators模块导入多个验证器类
from .services.validators import (
    CantShareEmailValidator,
    EmailsMustBeDifferent,
    OldEmailMustMatch,
    OldPasswordMustMatch,
    PasswordsMustBeDifferent,
    ValidateAvatarURL,
)

# 创建一个HookimplMarker实例，用于标记属于"xfree"插件系统的函数
impl = HookimplMarker("xfree")


@impl(hookwrapper=True, tryfirst=True)
def xfree_tpl_profile_settings_menu():
    """
    这个函数用于处理xfree用户模板配置文件设置菜单的插件钩子。
    它将从钩子返回的列表展平成一个单一的可迭代对象，
    以便用于填充菜单。
    """
    # 定义一个包含菜单选项的列表，每个选项是一个包含端点和名称的元组
    results = [
        (None, "Account Settings"),
        ("user.settings", "General Settings"),
        ("user.change_user_details", "Change User Details"),
        ("user.change_email", "Change E - Mail Address"),
        ("user.change_password", "Change Password"),
    ]
    # 使用yield来暂停函数执行，等待钩子函数执行完成并获取结果
    outcome = yield
    # 将预定义的菜单选项和钩子函数返回的结果连接成一个单一的可迭代对象
    outcome.force_result(chain(results, *outcome.get_result()))


@impl(hookwrapper=True, tryfirst=True)
def xfree_tpl_profile_links(user):
    """
    这个函数用于处理xfree用户模板配置文件链接的插件钩子。
    它将预定义的用户配置文件链接和钩子函数返回的结果连接成一个单一的可迭代对象。
    :param user: 用户对象，用于生成特定用户的导航链接
    """
    # 定义一个包含用户配置文件导航链接的列表
    results = [
        NavigationLink(
            endpoint="user.profile",
            name=_("Overview"),
            icon="fa fa - home",
            urlforkwargs={"username": user.username},
        ),
        NavigationLink(
            endpoint="user.view_all_topics",
            name=_("Topics"),
            icon="fa fa - comments",
            urlforkwargs={"username": user.username},
        ),
        NavigationLink(
            endpoint="user.view_all_posts",
            name=_("Posts"),
            icon="fa fa - comment",
            urlforkwargs={"username": user.username},
        ),
    ]
    # 使用yield来暂停函数执行，等待钩子函数执行完成并获取结果
    outcome = yield
    # 将预定义的导航链接和钩子函数返回的结果连接成一个单一的可迭代对象
    outcome.force_result(chain(results, *outcome.get_result()))


@impl
def xfree_gather_password_validators():
    """
    这个函数用于收集密码验证器。
    它返回一个包含密码验证器的列表，这些验证器用于验证用户密码相关操作。
    """
    return [OldPasswordMustMatch(), PasswordsMustBeDifferent()]


@impl
def xfree_gather_email_validators():
    """
    这个函数用于收集电子邮件验证器。
    它返回一个包含电子邮件验证器的列表，这些验证器用于验证用户电子邮件相关操作。
    """
    return [OldEmailMustMatch(), EmailsMustBeDifferent(), CantShareEmailValidator(User)]


@impl
def xfree_gather_details_update_validators():
    """
    这个函数用于收集用户详细信息更新验证器。
    它返回一个包含用户详细信息更新验证器的列表，这些验证器用于验证用户详细信息更新操作。
    """
    return [ValidateAvatarURL()]